package zone.com.zrefreshlayoutdemo.header;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.PorterDuff;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.nineoldandroids.animation.ValueAnimator;
import and.utils.image.BitmapComposer;
import and.utils.image.WaveHelper;
import and.utils.image.compress2sample.SampleUtils;
import zone.com.zanimate.value.ValueAnimatorProxy;
import zone.com.zrefreshlayout.AnimateBack;
import zone.com.zrefreshlayout.IHeaderView;
import zone.com.zrefreshlayout.R;
import zone.com.zrefreshlayout.ZRefreshLayout;
import zone.com.zrefreshlayout.utils.ScreenUtils;
import static zone.com.zrefreshlayout.utils.LogUtils.log;
/**
* Created by fuzhipeng on 2017/1/13.
*/
public class WaveHead implements IHeaderView {
private View rootView;
private ImageView imageView;
private int resourceId;
private static final int ANIMATION_DURATION = 1332 * 2;
private WaveUtils mWaveUtils;
@Override
public View getView(ZRefreshLayout zRefreshLayout) {
rootView = View.inflate(zRefreshLayout.getContext(), R.layout.header_meterial, null);
//注意inflate那种模式 第一层需要空出去 不然会wrapcontent
LinearLayout ll_main = (LinearLayout) rootView.findViewById(R.id.ll_main);
int[] screenPixs = ScreenUtils.getScreenPix((Activity) zRefreshLayout.getContext());
ll_main.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT
, (int) (screenPixs[1] * 0.2)));
imageView = new ImageView(zRefreshLayout.getContext());
int imageViewHeight2width = (int) (screenPixs[1] * 0.2);
imageView.setLayoutParams(new LinearLayout.LayoutParams(imageViewHeight2width, imageViewHeight2width));
ll_main.addView(imageView);
mWaveUtils = new WaveUtils();
mWaveUtils.wave(zRefreshLayout.getContext(), imageViewHeight2width);
return rootView;
}
@Override
public void onPullingDown(float fraction, float headHeight) {
imageView.setRotationX(90 - fraction * 90);
}
@Override
public void refreshAble(boolean refreshAble) {
}
@Override
public void animateBack(AnimateBack animateBack, float fraction, float headHeight, boolean mIScroll) {
if (animateBack == AnimateBack.RefreshAble_Back)
imageView.setRotationX(90 - fraction * 90);
}
@Override
public boolean interceptAnimateBack(AnimateBack animateBack, ZRefreshLayout.IScroll iScroll) {
return false;
}
@Override
public void onRefreshing(float headHeight, boolean isAutoRefresh) {
mWaveUtils.valueAnimator.start();
mWaveUtils.mWaveHelper.start();
}
@Override
public void onComplete() {
imageView.setRotationX(90);
mWaveUtils.valueAnimator.end();
mWaveUtils.mWaveHelper.cancel();
mWaveUtils.mWaveHelper.setLevelProgress(0F);
}
@Override
public IHeaderView clone_() {
WaveHead clone = new WaveHead();
clone.resourceId = resourceId;
return clone;
}
public int getResourceId() {
return resourceId;
}
public void setResourceId(int resourceId) {
this.resourceId = resourceId;
}
class WaveUtils {
private WaveHelper mWaveHelper;
private ValueAnimatorProxy valueAnimator = ValueAnimatorProxy.ofFloat(0, 1F)
.setDuration(ANIMATION_DURATION)
.setRepeatCount(ValueAnimator.INFINITE)
.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (mWaveHelper != null)
mWaveHelper.setLevelProgress((Float) animation.getAnimatedValue());
// log("onAnimationUpdate:" + (Float) animation.getAnimatedValue());
}
});
private void wave(final Context context, final int imageViewHeight2width) {
if (resourceId == -1)
throw new IllegalStateException("resourceId not be null!");
final Bitmap bt = SampleUtils.load(context, resourceId)
.override(imageViewHeight2width, imageViewHeight2width)
.bitmap();
final ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
final BitmapComposer bitmapComposer = BitmapComposer.newComposition(bt.getWidth(), bt.getHeight(), Bitmap.Config.ARGB_4444);
// Matrix first = new Matrix();
// first.postTranslate(0, -20);
mWaveHelper = new WaveHelper(bt.getWidth(), bt.getHeight(), new WaveHelper.RefreshCallback() {
@Override
public void refresh(Bitmap wave) {
Bitmap render = bitmapComposer.clear()
.newLayer(
BitmapComposer.Layer.bitmap(bt)
.colorFilter(new ColorMatrixColorFilter(colorMatrix))
).newLayer(
BitmapComposer.Layer.bitmap(bt)
.mask(wave, PorterDuff.Mode.DST_IN)
// .matrix(first)
).render();
imageView.setImageBitmap(render);
}
});
mWaveHelper.cancel();
mWaveHelper.setAmplitude(imageViewHeight2width / 16);
mWaveHelper.setLength(imageViewHeight2width / 1.2F);
mWaveHelper.setSpeed(imageViewHeight2width * 1.2F);
mWaveHelper.setLevelProgress(0F);
}
}
}